package com.imooc;

import org.junit.Test;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;

/** 高并发，多线程下，list,set,map不安全问题
 * @Date:2021/10/23/12:38
 * @Description:
 */
public class NotSafeDemo {

//    @Test
    public static void main( String[] argns){

        //1 展示线程不安全
//        List<Object> list = new ArrayList<>();
//        for (int i = 0; i < 30; i++) {
//            new Thread( () ->{            //-------有点像匿名方法
//                list.add(UUID.randomUUID().toString().substring(0, 4));
//                System.out.println(list);
//            }, "input thread name").start();
//        }


        //2 展示线程安全
//        List<Object> list =new  CopyOnWriteArrayList<>();
//        for (int i = 0; i < 30; i++) {
//            new Thread( () ->{            //-------有点像匿名方法
//                list.add(UUID.randomUUID().toString().substring(0, 4));
//                System.out.println(list);
//            }, "input thread name").start();
//        }


        //3 展示 map线程
//        HashMap<Object, Object> map = new HashMap<>();
//        for (int i = 0; i < 30; i++) {
//            new Thread( () ->{            //-------有点像匿名方法
//                map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0, 4));
//                System.out.println(map);
//            }, "input thread name").start();  //"input thread name"  这个是线程的名字,同一个线程
//        }

//        //4 展示 map线程
//        HashMap<Object, Object> map = new HashMap<>();
//        for (int i = 0; i < 30; i++) {
//            new Thread( () ->{            //-------有点像匿名方法
//                map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0, 4));
//                System.out.println(map);
//            }, String.valueOf(i)).start();  //"input thread name"  这个是线程的名字
//        }


        //5 展示 map线程
        ConcurrentHashMap<Object, Object> map = new ConcurrentHashMap<>();
        for (int i = 0; i < 30; i++) {
            new Thread( () ->{            //-------有点像匿名方法
                map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0, 4));
                System.out.println(map);
            }, String.valueOf(i)).start();  //"input thread name"  这个是线程的名字
        }


    }




}
